package org.holoeverywhere.addon;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout.DrawerListener;
import android.support.v4.widget.DrawerLayout.LayoutParams;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.Window;
import org.holoeverywhere.addon.IAddon.Addon;
import org.holoeverywhere.slider.R;
import org.holoeverywhere.slider.SliderMenu;
import org.holoeverywhere.widget.DrawerLayout;
@Addon(weight = 40)
public class AddonSlider extends IAddon {
public AddonSlider() {
registerActivity(AddonSliderA.class);
}
public static class AddonSliderA extends IAddonActivity {
private boolean mAddonEnabled = true;
private DrawerLayout mDrawerLayout;
private Context mMenuContext;
private int mMenuLayout;
private boolean mOverlayActionBar = false;
private SliderMenu mSliderMenu;
private void attach(View view, int gravity) {
if (view == null) {
return;
}
final ViewGroup.LayoutParams initialParams = view.getLayoutParams();
DrawerLayout.LayoutParams params;
if (initialParams instanceof DrawerLayout.LayoutParams) {
params = (LayoutParams) initialParams;
} else if (initialParams != null) {
params = new LayoutParams(initialParams);
} else {
params = new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT);
}
params.gravity = gravity;
view.setLayoutParams(params);
ViewParent parent = view.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(view);
}
requestDrawerLayout();
mDrawerLayout.addView(view, gravity == Gravity.NO_GRAVITY ? 0 : -1, params);
}
public void closeDrawer(int gravity) {
requestDrawerLayout().closeDrawer(gravity);
}
public void closeDrawer(View drawerView) {
requestDrawerLayout().closeDrawer(drawerView);
}
public void closeDrawers() {
requestDrawerLayout().closeDrawers();
}
public void closeLeftView() {
closeView(getLeftView());
}
public void closeRightView() {
closeView(getRightView());
}
private void closeView(View view) {
if (view != null && requestDrawerLayout().isDrawerOpen(view)) {
closeDrawer(view);
}
}
@Override
public View findViewById(int id) {
return mDrawerLayout != null ? mDrawerLayout.findViewById(id) : null;
}
public View getContentView() {
return get().findViewById(R.id.contentView);
}
@SuppressLint("InlinedApi")
public void setContentView(View view) {
attach(view, Gravity.NO_GRAVITY);
}
public DrawerLayout getDrawerLayout() {
return mDrawerLayout;
}
public void setDrawerLayout(DrawerLayout drawerLayout) {
mDrawerLayout = drawerLayout;
if (mDrawerLayout != null) {
mDrawerLayout.setId(R.id.slider);
}
}
public void setDrawerLayout(int layoutResource) {
final View view = get().getThemedLayoutInflater().inflate(layoutResource, null, false);
if (view instanceof DrawerLayout) {
setDrawerLayout((DrawerLayout) view);
} else {
get().setContentView(view);
setAddonEnabled(false);
}
}
public int getDrawerLockMode(int edgeGravity) {
return requestDrawerLayout().getDrawerLockMode(edgeGravity);
}
public int getDrawerLockMode(View drawerView) {
return requestDrawerLayout().getDrawerLockMode(drawerView);
}
public View getLeftView() {
return get().findViewById(R.id.leftView);
}
@SuppressLint("InlinedApi")
public void setLeftView(View view) {
attach(view, Gravity.START);
}
public Context getMenuContext() {
return mMenuContext;
}
public void setMenuContext(Context context) {
mMenuContext = context;
}
public int getMenuLayout() {
return mMenuLayout;
}
public View getRightView() {
return get().findViewById(R.id.rightView);
}
@SuppressLint("InlinedApi")
public void setRightView(View view) {
attach(view, Gravity.END);
}
public boolean isAddonEnabled() {
return mAddonEnabled;
}
public void setAddonEnabled(boolean addonEnabled) {
mAddonEnabled = addonEnabled;
}
public boolean isDrawerOpen(int drawerGravity) {
return requestDrawerLayout().isDrawerOpen(drawerGravity);
}
public boolean isDrawerOpen(View drawer) {
return requestDrawerLayout().isDrawerOpen(drawer);
}
public boolean isDrawerVisible(int drawerGravity) {
return requestDrawerLayout().isDrawerVisible(drawerGravity);
}
public boolean isDrawerVisible(View drawer) {
return requestDrawerLayout().isDrawerVisible(drawer);
}
public boolean isOverlayActionBar() {
return mOverlayActionBar;
}
public void setOverlayActionBar(boolean overlayActionBar) {
mOverlayActionBar = overlayActionBar;
}
public SliderMenu obtainDefaultSliderMenu() {
return obtainDefaultSliderMenu(0);
}
public SliderMenu obtainDefaultSliderMenu(int menuLayout) {
if (mSliderMenu != null) {
return mSliderMenu;
}
mMenuLayout = menuLayout;
mSliderMenu = new SliderMenu(this);
mSliderMenu.setHandleHomeKey(true);
final Context menuContext = obtainMenuContext(mSliderMenu);
setDrawerLayout(R.layout.slider_default_layout);
setOverlayActionBar(true);
mSliderMenu.makeDefaultMenu(menuContext);
return mSliderMenu;
}
public Context obtainMenuContext(SliderMenu sliderMenu) {
if (mMenuContext != null) {
return mMenuContext;
}
return mMenuContext = sliderMenu.obtainMenuContext(get());
}
public SliderMenu obtainSliderMenu() {
if (mSliderMenu == null) {
mSliderMenu = new SliderMenu(this);
}
return mSliderMenu;
}
@Override
public boolean onNavigateUp() {
if (mSliderMenu != null) {
return mSliderMenu.onNavigateUp();
}
return super.onNavigateUp();
}
@SuppressLint("NewApi")
@Override
public void onPostCreate(Bundle savedInstanceState) {
if (mSliderMenu != null) {
mSliderMenu.onPostCreate(savedInstanceState);
}
if (!mAddonEnabled) {
return;
}
requestDrawerLayout();
final View contentView = get().findViewById(R.id.contentView);
if (contentView == null) {
throw new IllegalStateException(
"You should specify your content view by @id/contentView");
}
final View leftView = get().findViewById(R.id.leftView), rightView = get()
.findViewById(R.id.rightView);
mDrawerLayout.removeAllViewsInLayout();
if (mOverlayActionBar) {
mDrawerLayout.setFitsSystemWindows(true);
get().setContentView(contentView);
ViewGroup decorView = (ViewGroup) get().getWindow().getDecorView();
View view = decorView.getChildAt(0);
decorView.removeView(view);
setContentView(view);
decorView.addView(mDrawerLayout, 0);
} else {
get().setContentView(mDrawerLayout);
setContentView(contentView);
}
setLeftView(leftView);
setRightView(rightView);
}
@Override
public void onResume() {
if (mSliderMenu != null) {
mSliderMenu.onResume();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mSliderMenu != null) {
mSliderMenu.onSaveInstanceState(outState);
}
}
public void openContentView() {
closeDrawers();
}
public void openContentViewDelayed(int delay) {
handler().postDelayed(new Runnable() {
@Override
public void run() {
openContentView();
}
}, delay);
}
public void openDrawer(int gravity) {
requestDrawerLayout().openDrawer(gravity);
}
public void openDrawer(View drawerView) {
requestDrawerLayout().openDrawer(drawerView);
}
public void openLeftView() {
openView(getLeftView());
}
public void openRightView() {
openView(getRightView());
}
private void openView(View view) {
if (view != null && !requestDrawerLayout().isDrawerOpen(view)) {
openDrawer(view);
}
}
private DrawerLayout requestDrawerLayout() {
if (mDrawerLayout == null && mAddonEnabled) {
setDrawerLayout(R.layout.slider_default_layout);
}
return mDrawerLayout;
}
@Override
public boolean requestWindowFeature(int featureId) {
if (Window.FEATURE_ACTION_BAR_OVERLAY == featureId) {
setOverlayActionBar(true);
}
return super.requestWindowFeature(featureId);
}
public void setDrawerListener(DrawerListener listener) {
requestDrawerLayout().setDrawerListener(listener);
}
public void setDrawerLockMode(int lockMode) {
requestDrawerLayout().setDrawerLockMode(lockMode);
}
public void setDrawerLockMode(int lockMode, int edgeGravity) {
requestDrawerLayout().setDrawerLockMode(lockMode, edgeGravity);
}
public void setDrawerLockMode(int lockMode, View drawerView) {
requestDrawerLayout().setDrawerLockMode(lockMode, drawerView);
}
public void setDrawerShadow(Drawable shadowDrawable, int gravity) {
requestDrawerLayout().setDrawerShadow(shadowDrawable, gravity);
}
public void setDrawerShadow(int resId, int gravity) {
requestDrawerLayout().setDrawerShadow(resId, gravity);
}
public void setScrimColor(int color) {
requestDrawerLayout().setScrimColor(color);
}
public void toggle() {
View view = getLeftView();
if (view == null) {
view = getRightView();
}
if (view == null) {
return;
}
if (requestDrawerLayout().isDrawerOpen(view)) {
openContentView();
} else {
openView(view);
}
}
}
}